package haierhome.krund.cn.daggertworetrofitrxjavamvp.rxjava.lambda;

import android.annotation.SuppressLint;
import android.os.Build;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;

import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;

import haierhome.krund.cn.daggertworetrofitrxjavamvp.R;

/**
 * Lambda表达式
 * https://www.jdon.com/idea/java/10-example-of-lambda-expressions-in-java8.html
 */

public class LambdaActivity extends AppCompatActivity {

    Button bt_lambda;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_lambda);

        initView();
    }

    private void initView() {
        bt_lambda = (Button) findViewById(R.id.bt_lambda);
    }

    @SuppressLint("NewApi")
    private void initListener() {

        bt_lambda.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
            }
        });
        //示例1 监听事件处理 无返回值  有参数
//        bt_lambda.setOnClickListener(v -> Log.i("1111","1111"));
//        bt_lambda.setOnClickListener((v)-> Log.i("1111","1111"));


//        示例2 线程  无返回值 无参数
//        new Thread(new Runnable() {
//            @Override
//            public void run() {
//
//            }
//        }).start();
        new Thread(()-> Log.i("1111","1111"));

//        示例3 有返回值
//        bt_lambda.setOnTouchListener(new View.OnTouchListener() {
//            @Override
//            public boolean onTouch(View v, MotionEvent event) {
//                return false;
//            }
//        });
//
//        bt_lambda.setOnTouchListener((v,event)->(false));
//        bt_lambda.setOnTouchListener((v,event)->{
//            Log.i("1111",1111+"");
//            return false;
//        });

        /**
         * 上述总结
         */
//        (params) -> expression
//        (params) ->statement
//        (params) ->{ statements}


        /**
         * 遍历集合
         */
//        List<String> features = Arrays.asList("Lambdas", "Default Method", "Stream API", "Date and Time API");
//
//        for (String feature : features) {
//            System.out.println(feature);
//        }
//
//        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
//            features.forEach(n-> Log.i("1111","1111"));
//        }


//        4.使用Lambda表达式和函数接口
//        为了支持函数编程，Java 8加入了一个新的包java.util.function，
//        其中有一个接口java.util.function.Predicate是支持Lambda函数编程：

//        传入集合和条件；
        List languages = Arrays.asList("Java", "Scala", "C++", "Haskell", "Lisp");

        System.out.println("Languages which starts with J :");
        filter(languages, (str) -> str.startsWith("J"));

        System.out.println("Languages which ends with a ");
        filter(languages, (str) -> str.endsWith("a"));

        System.out.println("Print all languages :");
        filter(languages, (str) -> true);

        System.out.println("Print no language : ");
        filter(languages, (str) -> false);

        System.out.println("Print language whose length greater than 4:");
        filter(languages, (str) -> str.length() > 4);


        //5.复杂的结合Predicate 使用
        //java.util.function.Predicate提供and(), or() 和 xor()
        //可以进行逻辑操作，比如为了得到一串字符串中以"J"开头的4个长度：
        // We can even combine Predicate using and(), or() And xor() logical functions
        // for example to find names, which starts with J and four letters long, you
        // can pass combination of two Predicate


//        Predicate<String> startsWithJ = (n) -> n.startsWith("J");
//        Predicate<String> fourLetterLong = (n) -> n.length() == 4;
//
//        names.stream()
//                .filter(startsWithJ.and(fourLetterLong))
//                .forEach((n) -> System.out.print("\nName, which starts with
//        'J' and four letter long is : " + n));

        /**
         *    6.使用Lambda实现Map 和 Reduce
         最流行的函数编程概念是map，它允许你改变你的对象，在这个案例中，
         我们将costBeforeTeax集合中每个元素改变了增加一定的数值，
         我们将Lambda表达式 x -> x*x传送map()方法，这将应用到stream中所有元素。
         然后我们使用 forEach() 打印出这个集合的元素.
         */

        // applying 12% VAT on each purchase
        // Without lambda expressions:
//        List<Integer> costBeforeTax = Arrays.asList(100, 200, 300, 400, 500);
//        for (Integer cost : costBeforeTax) {
//            double price = cost + .12 * cost;
//            System.out.println(price);
//        }

        // With Lambda expression:
        List<Integer> costBeforeTax = Arrays.asList(100, 200, 300, 400, 500);
        costBeforeTax.stream().map((cost) -> cost + .12 * cost)
                .forEach(System.out::println);

    }

    private int add(int a, int b) {
        return a + b;
    }

    /**
     * 过滤方法
     *
     * @param names
     * @param condition
     */
    public static void filter(List<String> names, Predicate<String> condition) {
        for (String name : names) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                if (condition.test(name)) {
                    System.out.println(name + " ");
                }
            }
        }
    }


}